redis 主从复制


1. redis主从复制的使用场景

  • 利用复制功能当主redis出现问题时,我们可以人工的切换到从redis继续提供服务,此时redis的数据和宕机时的数据几乎完全一致

  • 复制功能也可用作数据备份

2. redis主从复制的原理

  • 详细的解释

    • 从服务器向主服务器发送 SYNC 命令
    • 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令
    • 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件
    • 主服务器将缓冲区储存的所有写命令发送给从服务器执行

  • 简单的解释

    • 在开启主从复制的时候,使用的是RDB方式的,同步主从数据的
    • 同步开始之后,通过主库命令传播的方式,主动的复制方式实现
    • 2.8以后实现PSYNC的机制,实现断线重连

3. redis主从复制的架构图




4. redis主从复制的环境准备

  • 准备两个或两个以上的 redis

  • 创建三个redis配置文件

touch /opt/redis-4.0.10/{redis-6381.conf,redis-6382.conf,redis-6383.conf}


  • 创建三个redis配置文件所需要的目录

mkdir /data/{6381,6382,6383}


  • redis-6381.conf 的配置文件

vim /opt/redis-4.0.10/redis-6381.conf

# 绑定远程连接ip,如需要远程访问当前服务器的redis(即: 让别人连接你的redis),那么就需要填写当前服务器的ip -> 0.0.0.0 代表 127.0.0.1 也代表 当前服务器ip
bind 0.0.0.0

# redis 端口
port 6381

# 是否后台运行 redis,在执行 redis-server redis.conf 命令时,如果为 yes 那么就不进入阻塞状态(即: 还可以输入其他命令),如果为 no 进入阻塞状态 (即: 无法输入别的命令)
daemonize yes

# 将 redis 进程id 写入到 redis.pid 文件中,注意: /data/6381/ 目录必须存在(即: 如果没有就需要手动创建)
pidfile /data/6381/redis.pid

# 日志级别
loglevel notice

# 日志文件,注意: /data/6381/ 目录必须存在(即: 如果没有就需要手动创建)
logfile "/data/6381/redis.log"

# 是否开启安全模式,如果开启,那么redis必须设置密码才能进行连接
protected-mode no

# 配置 redis 的数据存放文件夹,一般存放redis的持久化存储文件和redis的日志文件等,注意: /data/6381/ 目录必须存在(即: 如果没有就需要手动创建)
dir /data/6381

  • redis-6382.conf 的配置文件

vim /opt/redis-4.0.10/redis-6382.conf

# 绑定远程连接ip,如需要远程访问当前服务器的redis(即: 让别人连接你的redis),那么就需要填写当前服务器的ip -> 0.0.0.0 代表 127.0.0.1 也代表 当前服务器ip
bind 0.0.0.0

# redis 端口
port 6382

# 是否后台运行 redis,在执行 redis-server redis.conf 命令时,如果为 yes 那么就不进入阻塞状态(即: 还可以输入其他命令),如果为 no 进入阻塞状态 (即: 无法输入别的命令)
daemonize yes

# 将 redis 进程id 写入到 redis.pid 文件中,注意: /data/6382/ 目录必须存在(即: 如果没有就需要手动创建)
pidfile /data/6382/redis.pid

# 日志级别
loglevel notice

# 日志文件,注意: /data/6382/ 目录必须存在(即: 如果没有就需要手动创建)
logfile "/data/6382/redis.log"

# 是否开启安全模式,如果开启,那么redis必须设置密码才能进行连接
protected-mode no

# 配置 redis 的数据存放文件夹,一般存放redis的持久化存储文件和redis的日志文件等,注意: /data/6382/ 目录必须存在(即: 如果没有就需要手动创建)
dir /data/6382

  • redis-6383.conf 的配置文件

vim /opt/redis-4.0.10/redis-6383.conf

# 绑定远程连接ip,如需要远程访问当前服务器的redis(即: 让别人连接你的redis),那么就需要填写当前服务器的ip -> 0.0.0.0 代表 127.0.0.1 也代表 当前服务器ip
bind 0.0.0.0

# redis 端口
port 6383

# 是否后台运行 redis,在执行 redis-server redis.conf 命令时,如果为 yes 那么就不进入阻塞状态(即: 还可以输入其他命令),如果为 no 进入阻塞状态 (即: 无法输入别的命令)
daemonize yes

# 将 redis 进程id 写入到 redis.pid 文件中,注意: /data/6383/ 目录必须存在(即: 如果没有就需要手动创建)
pidfile /data/6383/redis.pid

# 日志级别
loglevel notice

# 日志文件,注意: /data/6383/ 目录必须存在(即: 如果没有就需要手动创建)
logfile "/data/6383/redis.log"

# 是否开启安全模式,如果开启,那么redis必须设置密码才能进行连接
protected-mode no

# 配置 redis 的数据存放文件夹,一般存放redis的持久化存储文件和redis的日志文件等,注意: /data/6383/ 目录必须存在(即: 如果没有就需要手动创建)
dir /data/6383

  • 同时启动三个 redis

redis-server /opt/redis-4.0.10/redis-6381.conf

redis-server /opt/redis-4.0.10/redis-6382.conf

redis-server /opt/redis-4.0.10/redis-6383.conf


  • 主从规划

    • 主 redis : 6381
    • 从 redis : 6382、6383

5. 从 redis 的配置方式一: 以命令的方式配置从 reids

  • 从 redis 配置成功后,默认只能读取数据,不能写入数据

  • 从 redis : 6382 的配置

    • 进入 6382 的 redis

redis-cli -p 6382

    • 配置 6382 的 redis 为从身份

127.0.0.1:6382> slaveof 127.0.0.1 6381

    • 查看 6382 的 redis 身份状态

redis-cli -p 6382 info replication

  • 从 redis : 6383 的配置

    • 进入 6383 的 redis

redis-cli -p 6383

    • 配置 6383 的 redis 为从身份

127.0.0.1:6383> slaveof 127.0.0.1 6381

    • 查看 6383 的 redis 身份状态

redis-cli -p 6383 info replication


6. 从 redis 的配置方式二: 以修改配置文件的形式配置从 redis

  • 从 redis 配置成功后,默认只能读取数据,不能写入数据

  • 从 redis : 6382 的配置文件设置

    • 进入配置文件

vim /opt/redis-4.0.10/redis-6382.conf

    • 修改配置文件

# 将 6381 redis 设置为当前的 6382 redis 的 主redis
slaveof 127.0.0.1 6381


    • 查看 6382 的 redis 身份状态

redis-cli -p 6382 info replication

  • 从 redis : 6383 的配置文件设置

    • 进入配置文件

vim /opt/redis-4.0.10/redis-6383.conf

    • 修改配置文件

# 将 6381 redis 设置为当前的 6383 redis 的 主redis
slaveof 127.0.0.1 6381


    • 查看 6383 的 redis 身份状态

redis-cli -p 6383 info replication


7. 主 reids 的配置

  • 查看 6381 的 redis 身份状态

redis-cli -p 6381 info replication


8. 测试写入数据

  • 主 redis 写入数据,从 redis 查看数据是否进行了复制

    • 主 redis 写入数据

127.0.0.1:6381> set name 'Kevin'

    • 从 redis 查看数据是否进行了复制

127.0.0.1:6382> keys *
1) "name"
127.0.0.1:6382> get name
"Kevin"

127.0.0.1:6383> keys *
1) "name"
127.0.0.1:6383> get name
"Kevin"


9. 手动进行主从复制故障切换

  • 当主 redis 6381 挂了,我想要在 6382 或 6383 redis 之间选择一个当主redis

  • 关闭 主redis 6381

    • 查看主redis的进程pid

ps -ef | grep redis


    • 关闭主redis 6381

kill -KILL 7112

  • 查看 从redis 的状态

redis-cli -p 6382 info replication


redis-cli -p 6383 info replication


  • 关闭 6382 和 6383 的从库身份

redis-cli -p 6382 slaveof no one

redis-cli -p 6383 slaveof no one

  • 将 6382 设置为主 redis,将 6383 设置为从 redis

redis-cli -p 6383 slaveof 127.0.0.1 6382

  • 查看 6382 和 6383 的 redis 状态

redis-cli -p 6382 info replication


redis-cli -p 6383 info replication